// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef BASE_WIN_WAIT_CHAIN_H_
#define BASE_WIN_WAIT_CHAIN_H_

#include <wct.h>
#include <windows.h>

#include <vector>

#include "base/strings/string16.h"

namespace base {
namespace win {

    using WaitChainNodeVector = std::vector<WAITCHAIN_NODE_INFO>;

    // Gets the wait chain for |thread_id|. Also specifies if the |wait_chain|
    // contains a deadlock. Returns true on success.
    //
    // From MSDN: A wait chain is an alternating sequence of threads and
    // synchronization objects; each thread waits for the object that follows it,
    // which is owned by the subsequent thread in the chain.
    //
    // On error, |failure_reason| and/or |last_error| will contain the details of
    // the failure, given that they are not null.
    // TODO(pmonette): Remove |failure_reason| and |last_error| when UMA is
    // supported in the watcher process and pre-rendez-vous.
    BASE_EXPORT bool GetThreadWaitChain(DWORD thread_id,
        WaitChainNodeVector* wait_chain,
        bool* is_deadlock,
        base::string16* failure_reason,
        DWORD* last_error);

    // Returns a string that represents the node for a wait chain.
    BASE_EXPORT base::string16 WaitChainNodeToString(
        const WAITCHAIN_NODE_INFO& node);

} // namespace win
} // namespace base

#endif // BASE_WIN_WAIT_CHAIN_H_
